//封装axios
import originAxios from 'axios'
import Router from '@/router/index'
import { Loading } from 'element-ui'
import { Message } from 'element-ui'
import { internetProtocol } from '../config/ip'
export default function axios(option) {
  return new Promise((resoleve, reject) => {
    // 1.创建axios的实例
    const instance = originAxios.create({
      // baseURL: 'http://192.168.3.140:9850',
      baseURL: `https://${internetProtocol}`, // 线上接口地址 https
      // baseURL: `http://${internetProtocol}`, // 本地接口地址 http
      withCredentials: true
      // timeout: 50000,
    })

    let loadingInstance
    // 请求拦截
    instance.interceptors.request.use(
      (config) => {
        // console.log(config)
        // console.log('来到了request拦截success中');
        // 1.当发送网络请求时, 在页面中添加一个loading组件, 作为动画
        if (config.url != '/rfid/sendOrder') {
          loadingInstance = Loading.service({ fullscreen: true })
        }

        // 2.某些请求要求用户必须登录, 判断用户是否有token, 如果没有token跳转到login页面
        if (localStorage.getItem('Authorization')) {
          config.headers['Authorization'] =
            localStorage.getItem('Authorization')
        }
        // 3.对请求的参数进行序列化(看服务器是否需要序列化)
        // config.data = qs.stringify(config.data);
        // console.log(config)

        // 4.等等
        // 设置拦截器, 把content-type 设置成application/x-www-form-urlencoded, 降级为简单请求, 就不会发送options请求
        // 注意如果是post方法, 需要qs模块转换一下参数

        // 下面这个配置是上一任前段配置的, 只配置了第一行
        config.headers['Content-Type'] = 'application/json'
        // config.headers['Set-Cookie'] = 'HttpOnly;Secure;SameSite=None'
        // console.log(config)
        return config
      },
      (err) => {
        // console.log('来到了request拦截failure中');
        //如果有加载中组件，则关闭
        if (loadingInstance) {
          loadingInstance.close()
        }
        return err
      }
    )

    instance.interceptors.response.use(
      (response) => {
        // console.log('来到了response拦截success中')
        // console.log(response, '来到了response拦截success中')

        //如果有加载中组件，则关闭
        if (loadingInstance) {
          loadingInstance.close()
        }

        switch (response.data.code) {
          case 307:
            localStorage.removeItem('Authorization')
            Router.push({
              path: '/login'
            })
            break
          case 11500:
            Message({
              message: response.data.msg,
              type: 'warning',
              offset: 300
            })
            break
          case 10000:
            Message({
              message: '货号库存数据有改动',
              type: 'warning',
              offset: 300
            })
            let urlObject = window.URL || window.webkitURL || window
            let export_blob = new Blob([response.data.msg])
            let save_link = document.createElementNS(
              'http://www.w3.org/1999/xhtml',
              'a'
            )
            save_link.href = urlObject.createObjectURL(export_blob)
            save_link.download = '货号库存数据有改动'
            save_link.click()
            break
        }
        // 208 是检查账号没注册的时候返回的
        if (
          response.data.code != 200 &&
          response.data.code != 208 &&
          response.data.code != 11500 &&
          response.data.msg
        ) {
          Message({
            message: response.data.msg,
            type: 'warning',
            offset: 300
          })
        }
        return response
      },
      (err) => {
        // console.log('来到了response拦截failure中');
        // console.log(err)
        //如果有加载中组件，则关闭
        if (loadingInstance) {
          loadingInstance.close()
        }
        return err
      }
    )

    // 2.传入对象进行网络请求
    instance(option)
      .then((res) => resoleve(res))
      .catch((err) => reject(err))
  })
}
